package HUZ;

public class demo4 {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("主线程启动---");
        Thread t = new Thread(() -> {
            //其中这里的Thread.currentThread()是用于获取当前线程引用的方法
            //以下判断"线程的中断标志位"使用isInterrupted来判断线程的中断标识信息
            //当捕获到线程阻塞状态收到中断信息时并抛出异常时，catch语块执行通知并判断线程中断标志位仍为false

            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("线程运行中....");
                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e) {

                    //interrupt产生行为并且当捕获到异常时进行代码处理的代码区域
                    //也就是你自己决定是退出还是继续的区域

                    //捕获到异常说明线程发出中断信息时该线程处于"阻塞状态"
                    //所以"中断标志"并未被设置为true,需要在进行依次中断通知
                    //才能将标志位设为true
                    Thread.currentThread().interrupt();
                    System.out.println("捕获到异常，自己处理异常的代码区");
                    // [1] 立即退出
                    // break;

                    System.out.println("新线程即将退出!");
                    // [2] 稍后退出, 此处的 sleep 可以换成任意的用来收尾工作的代码
//                    try {
//                        Thread.sleep(3000);
//                    } catch (InterruptedException ex) {
//                        ex.printStackTrace();
//                    }
//                    break;

                    // [3] 不退出! 啥都不做, 就相当于忽略了异常.

                    // [4]不退出，只打印一下异常原因e.printStackTrace();
                    System.out.println("中断标志位:"+Thread.currentThread().isInterrupted());
                }
            }
            System.out.println("新线程已经退出!");
        });
        t.start();
        Thread.sleep(1000);
        //给线程t发送中断信息
        t.interrupt();
        t.join();
        Thread.sleep(2000);
        System.out.println("主线程退出!---");
    }
}
